# -*- encoding:utf-8 -*-

# 装饰器本质上是一个Python函数，它可以让其他函数在不需要做任何代码变动的前提下增加额外功能，
# 装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景，比如：插入日志、性能测试、
# 事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计，有了装饰器，我们就可以
# 抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲，装饰器的作用就是为已经存在
# 的对象添加额外的功能。


from flask import session,redirect,url_for,g
from functools import wraps

# 登陆限制中user_id的优化，定义为变量
import config


# 定义装饰器，登陆功能限制
def login_required(func):
    # 使用wraps保留func的相关信息，使用前需要from functools import wraps导入
    @wraps(func)
    #由于定义（）中的名称需要一致，考虑到多个地方将用到这个函数，所以用*args,**kwargs
    def inner(*args,**kwargs):
        # 通过session中的user_id是否存在，来判断用户是否已经登陆，若登陆则
        if config.BACK_USER_ID in session:
            # 若已经登录，则返回相关信息
            return func(*args,**kwargs)
        else:
            # 若没有登陆，则跳转初始页面
            return redirect(url_for('back.login'))
    # 返回inner结果
    return inner

#
# # 解释说明装饰器的功能
# @login_required
# def index():
#     return "cms.index"
# # 结果
# index=login_required(index)=inner
# # 等同于方法
# index(username)== inner(usrename)



#后台权限管理限制
# 由于直接输入地址可以访问后台，所以需要设置访问权限设置，这里定义装饰器
# 第一个def  用来传入参数
def permission_required(permission):
    # outter为主要的装饰器功能
    def outter(func):
        @wraps(func)
        def inner(*args,**kwargs):
            # 获取用户信息
            user=g.back_user
            # 判断权限
            if user.has_permissions(permission):
                return func(*args,**kwargs)
            else:
                return redirect(url_for('back.index'))
        #针对outter函数返回inner结果
        return inner
    # 返回outter,对调用的函数进行装饰
    return outter